\documentclass[utf8]{ctexart}

\usepackage[a4paper,left=1.25in,right=1.25in,top=1in,bottom=1in]{geometry}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{booktabs}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{float}
\usepackage{indentfirst}
\usepackage{gnuplot-lua-tikz}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{shapes.geometric, arrows}
\usepackage{algorithm}
\usepackage{algorithmic}
\usepackage{newclude}
\usepackage[perpage]{footmisc}

\graphicspath{ {images/} }
\raggedbottom	% 令页面在垂直方向向顶部对齐
\renewcommand\qedsymbol{QED}
\newcommand{\sign}[1]{\mathrm{sgn}(#1)}
\everymath{\displaystyle}   % 行内公式采用行间公式格式排列
\pagestyle{plain}

\title{项目作业作业报告}
\author{姓名：殷文良\qquad 学号：3200101893}
\date{}

\begin{document}
\maketitle
\CTEXsetup[format={\Large\bfseries}]{section}

\section{项目设计思路}
本次项目作业是在第二次上机作业的基础上进一步拓展与完善，使用了第二次上机作业中的类Polynomial和类InterpConditions。本次作业按照要求设计了ppForm,B-SplineForm和cardinalB-SplineForm三种插值法，实现分段线性样条插值和$S_3^2$样条插值，并针对$S_3^2$，支持三种不同的边界条件，同时支持函数拟合和曲线拟合。本次项目设计的UML类图如图\ref{fig1-1}所示。
\begin{figure}[H]
  \centering
  \includegraphics[width=1.000\textwidth]{class.png}
  \caption{UML类图}
  \label{fig1-1}
\end{figure}


\section{测试说明}
\subsection{环境配置}
本项目作业调用了数值计算库BLAS和LAPACK，在测试程序中包含了头文件cblas.h和lapacke.h，因此在测试之前请确保相关库已经安装。另外，建议将这两个库编译后的静态库或动态库置于系统的默认包含路径下或将其文件路径添加到环境变量，或者手动添加Makefile中静态库的路径，否则运行时可能因找不到相关库而报错。
\subsection{测试流程}
\begin{itemize}
\item
  在shell终端输入\verb!make report!，可以得到上机报告report.pdf；
\item
  在shell终端输入\verb!make(all)!，可以编译C++程序main.cpp，并执行\verb!./main!将输出结果重定向到文件result.txt中；
\item
  在shell终端输入\verb!make testall!，可以编译并执行测试算例，并将输出结果重定向到文件test.txt中；
\item
  在shell终端输入\verb!make check!，可以检查程序main.cpp的内存泄漏情况。
\end{itemize}

\section{实验结果}
\begin{enumerate}
\item A\par
  这里我们使用两种边界条件去拟合函数。
  \begin{enumerate}
  \item complete condition\par
    函数拟合图像见图\ref{fig3-1}，误差分析以及收敛速度见表\ref{table3-1}。
    \begin{figure}[H]
      \centering
      \includegraphics[width=0.736\textwidth]{A1.png}
      \caption{cubic spline with complete condition}
      \label{fig3-1}
    \end{figure}

    \begin{table}[H]
	\centering
          \begin{tabular}{c|c   c   c   c   c}
            \hline
          & $n = 6$ & ratio & $n = 11$ & ratio & $n = 21$\\
          \hline
          $\left \| E \right \|_{\infty}$  & 4.22e-1 & 4.36 & 2.05e-2 & 2.70 & 3.17e-3\\
          \hline
          & $n = 21$ & ratio & $n = 41$ & ratio & $n = 81$\\
          \hline
          $\left \| E \right \|_{\infty}$ & 3.17e-3 & 3.52 & 2.75e-4&
                                                                      4.10 & 1.61e-5\\
          \hline
	\end{tabular}
        \caption{complete cubic spline : errors and convergence rates}        
        \label{table3-1}
    \end{table}
  \item not-a-knot condition\par
    函数拟合图像见图\ref{fig3-2}，误差分析以及收敛速度见表\ref{table3-2}。
    \begin{figure}[H]
      \centering
      \includegraphics[width=0.734\textwidth]{A2.png}
      \caption{cubic spline with not-a-knot condition}
      \label{fig3-2}
    \end{figure}

    \begin{table}[H]
	\centering
          \begin{tabular}{c|c   c   c   c   c}
            \hline
          & $n = 6$ & ratio & $n = 11$ & ratio & $n = 21$\\
          \hline
          $\left \| E \right \|_{\infty}$  & 4.32e-1 & 4.39 & 2.05e-2 & 2.70 & 3.17e-3\\
          \hline
          & $n = 21$ & ratio & $n = 41$ & ratio & $n = 81$\\
          \hline
          $\left \| E \right \|_{\infty}$ & 3.17e-3 & 3.52 & 2.75e-4&
                                                                      4.10 & 1.61e-5\\
            \hline
	\end{tabular}
          \caption{not-a-knot cubic spline : errors and convergence rates}
          \label{table3-2}
    \end{table}
    \end{enumerate}

\item C\par
  如果没理解错的话，B和C题的要求是一样的，这里就直接做C题了。\par
  函数拟合图像分别见图\ref{fig3-3}和图\ref{fig3-4}。
  \begin{figure}[H]
      \centering
      \includegraphics[width=0.739\textwidth]{C1.png}
      \caption{$S_1$ : cardinal B-spline for Theorem 3.57}
      \label{fig3-3}
  \end{figure}
  \begin{figure}[H]
      \centering
      \includegraphics[width=0.731\textwidth]{C2.png}
      \caption{$S_2$ : cardinal B-spline for Theorem 3.58}
      \label{fig3-4}
  \end{figure}

\item D\par
  $E_S$的值见表\ref{table3-3}。
  \begin{table}[H]
	\centering
          \begin{tabular}{c|c|c}
            \hline
          $x$ & $E_{S_1}(x)$ & $E_{S_2}(x)$ \\
          \hline
          $-3.5$  & $1.34\times10^{-3}$ & $0$ \\
          \hline
          $-3$  & $1.39\times10^{-17}$ & $1.42\times10^{-3}$ \\
          \hline
          $-0.5$  & $2.05\times10^{-2}$ & $1.11\times10^{-16}$ \\
          \hline
          $0$  & $0$ & $0.1202$ \\
          \hline
          $0.5$  & $2.05\times10^{-2}$ & $1.11\times10^{-16}$ \\
          \hline
          $3$  & $1.39\times10^{-17}$ & $1.42\times10^{-3}$ \\
          \hline
          $3.5$  & $6.70\times10^{-4}$ & $0$ \\
          \hline
	\end{tabular}
          \caption{values of $E_S(x)$ for two cardinal B-splines}
          \label{table3-3}
  \end{table}
  由表\ref{table3-3}，我们发现$S_1$在$-3,0,3$达到机器精度，而$S_2$在$-3.5,-0.5,0.5,3.5$达到机器精度。这是因为这些点分别是两个样条函数的插值节点。注意到$S_2$在0附近表现很差，因此$S_1$更精确。
\item E\par
  我们将$\frac{2}{3}$的点设置在$y>1$的区域以捕捉更多细节，在$(0,-1)$和$(0,1)$两个点处使用complete condition去保持光滑性。函数拟合图像见图\ref{fig3-5}。
  \begin{figure}[H]
      \centering
      \includegraphics[width=0.718\textwidth]{E.png}
      \caption{heart function for $n = 10,40,160$}
      \label{fig3-5}
  \end{figure}

\item F\par
  对于$n=1$和$n=2$，截断幂函数的图像分别见图\ref{fig3-6}和图\ref{fig3-7}。
  \begin{figure}[H]
      \centering
      \includegraphics[width=0.727\textwidth]{F1.png}
      \caption{table of divided difference for truncated power
          functions, $n = 1$}
      \label{fig3-6}
  \end{figure}
  \begin{figure}[H]
      \centering
      \includegraphics[width=0.724\textwidth]{F2.png}
      \caption{table of divided difference for truncated power
          functions, $n = 2$}
      \label{fig3-7}
  \end{figure}
  
\end{enumerate}

\section{内存泄露检查}
图\ref{fig4-1}说明程序不存在内存泄露的情况。
\begin{figure}[H]
  \centering
  \includegraphics[width=0.810\textwidth]{memory.png}
  \caption{内存泄漏检查}
  \label{fig4-1}
\end{figure}

\section{总结}
这次的项目作业编程量十分大，难度也很高，尤其是在最开始设计项目架构时思路不够清晰，导致设计仍存在一些不足之处。不过收获也是颇丰，对数值计算库BLAS和LAPACK有了一定的了解和掌握，对三次样条的理解更加深入。最后，十分感谢王何宇老师，胡双、颜嘉图助教这学期的辛勤付出！

\end{document}
